"""
索引管理与元数据操作示例

该示例展示了SQLServerManager类的索引管理功能和元数据查询能力，包括索引的创建、删除、
表结构查询以及对象存在性检查等操作。
"""
from modules.database.sqlserver_manager import SQLServerManager
import logging

# 配置日志
handler = logging.StreamHandler()
handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
logger = logging.getLogger('sqlserver_manager')
logger.addHandler(handler)
logger.setLevel(logging.INFO)

def demonstrate_index_and_metadata_operations():
    # 数据库连接参数
    db_config = {
        'server': 'localhost',
        'database': 'test_db',
        'username': 'sa',
        'password': 'your_password',
        'port': 1433
    }

    # 使用上下文管理器确保连接正确关闭
    with SQLServerManager(**db_config) as db:
        try:
            table_name = 'EmployeeMetadata'
            index_name = 'IX_EmployeeMetadata_Department'

            # 1. 检查表是否存在，如果不存在则创建
            logger.info("\n=== 检查表是否存在 ===")
            if db.is_table_exists(table_name):
                logger.info(f"表 {table_name} 已存在，删除旧表...")
                db.execute_non_query(f"DROP TABLE {table_name}")

            logger.info(f"创建新表 {table_name}...")
            db.execute_non_query(f"""
                CREATE TABLE {table_name} (
                    ID INT PRIMARY KEY IDENTITY(1,1),
                    Name NVARCHAR(50) NOT NULL,
                    Department NVARCHAR(50) NOT NULL,
                    Salary DECIMAL(10,2) NOT NULL,
                    HireDate DATE NOT NULL,
                    Email NVARCHAR(100) UNIQUE
                )
            """)

            # 2. 创建索引
            logger.info("\n=== 创建索引 ===")
            if db.create_index(table_name, index_name, ['Department']):
                logger.info(f"成功创建索引 {index_name}")
            else:
                logger.error(f"创建索引 {index_name} 失败")

            # 3. 查询表结构
            logger.info("\n=== 查询表结构 ===")
            schema = db.get_table_schema(table_name)
            logger.info(f"表 {table_name} 的结构信息:")
            for column in schema:
                logger.info(f"- {column['COLUMN_NAME']}: {column['DATA_TYPE']} (可空: {column['IS_NULLABLE']})")

            # 4. 检查列是否存在
            logger.info("\n=== 检查列是否存在 ===")
            columns_to_check = ['Email', 'Phone']
            for column in columns_to_check:
                exists = db.is_column_exists(table_name, column)
                logger.info(f"列 {column} {'存在' if exists else '不存在'}")

            # 5. 查询索引信息
            logger.info("\n=== 查询索引信息 ===")
            indexes = db.get_indexes(table_name)
            if indexes:
                logger.info(f"表 {table_name} 的索引信息:")
                for idx in indexes:
                    logger.info(f"- {idx['index_name']}: {idx['column_names']} (唯一: {idx['is_unique']})")
            else:
                logger.warning(f"表 {table_name} 没有找到索引")

            # 6. 删除索引
            logger.info("\n=== 删除索引 ===")
            if db.drop_index(table_name, index_name):
                logger.info(f"成功删除索引 {index_name}")
            else:
                logger.error(f"删除索引 {index_name} 失败")

        except Exception as e:
            logger.error(f"操作发生错误: {str(e)}", exc_info=True)
        finally:
            # 7. 清理演示表
            logger.info("\n清理演示表...")
            db.execute_non_query(f"DROP TABLE IF EXISTS {table_name}")

if __name__ == "__main__":
    demonstrate_index_and_metadata_operations()